package config

import (
	"io/ioutil"
	"log"
	"sync"

	"gopkg.in/yaml.v3"
)

// Config 定义了配置文件中的结构
type Config struct {
	API struct {
		ClientId     string `yaml:"ClientId"`
		ClientSecret string `yaml:"Client_secret"`
		APIUrl       string `yaml:"api_url"`
		APIKey       string `yaml:"api_key"`
		ImgUrl       string `yaml:"img_url"`
	} `yaml:"api"`
	Repository struct {
		URL  string `yaml:"url"`
		Repo string `yaml:"repo"`
	} `yaml:"repository"`
	Token struct {
		CutToken  string `yaml:"cutToken"`
		TailToken string `yaml:"tailToken"`
	} `yaml:"token"`
}

// 全局配置实例和同步对象，用于确保只初始化一次
var (
	instance *Config
	once     sync.Once
)

// InitConfig 读取并解析 YAML 配置文件，只加载一次
func InitConfig(filename string) {
	once.Do(func() {
		data, err := ioutil.ReadFile(filename)
		if err != nil {
			log.Fatalf("Failed to read config file: %v", err)
		}

		instance = &Config{}
		if err := yaml.Unmarshal(data, instance); err != nil {
			log.Fatalf("Failed to parse config file: %v", err)
		}
	})
}

// GetConfig 返回全局配置实例
func GetConfig() *Config {
	return instance
}
